﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Telerik.Web.UI;
using System.Collections;
using System.Text;
using Proxy;
using SIM.Util;

namespace SIM.Geo.UI.Geo
{
    public partial class frmLitologia1 : PageBase
    {
        List<LitologiaAlteracionesResponse> listaAlteraciones = new List<LitologiaAlteracionesResponse>();
        List<LitologiaMineralesResponse> listaMinerales = new List<LitologiaMineralesResponse>();
        private const string SESSION_ALTERACIONES = "Alteraciones";
        private const string SESSION_MINERALES = "Minerales";

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                this.rgLista.ClientSettings.Scrolling.ScrollHeight = int.Parse(System.Configuration.ConfigurationManager.AppSettings["listaPrincipalScrollHeight"]);
                string id = Request.Params["id"].ToString();
                this.hidCodigoSondaje.Value = id;
                CargarSondaje();
                CargarCombos();
                Listar();
            }
            this.ddlTipoRoca.Attributes.Add("onchange", "return HabilitarTipoRoca();");
        }

        private void CargarSondaje()
        {
            try
            {
                using (SESondajeClient proxy = new SESondajeClient("BasicHttpBinding_ISESondaje"))
                {
                    this.txtNombreSondaje.Enabled = false;
                    var sondaje = proxy.ObtenerSondaje(int.Parse(this.hidCodigoSondaje.Value));
                    if (sondaje != null)
                    {
                        this.txtNombreSondaje.Text = sondaje.NombreDDH;
                        this.hidEstadoSondaje.Value = sondaje.Estado.ToString();
                        this.hidCumplimiento.Value = sondaje.CumplioLitologia.ToString();
                        if (sondaje.Estado.CompareTo((short)enmEstadoSondaje.Finalizado.GetHashCode()) == 0 ||
                            sondaje.CumplioLitologia.CompareTo((short)enmEstadoCumplimiento.Cumplido.GetHashCode()) == 0)
                        {
                            this.ibtnRegistrar.Enabled = false;
                            this.ibtnRegistrar.ToolTip = BUTTON_TOOLTIP_DESHABILITADO;
                            this.ibtnFinalizar.Enabled = false;
                            this.ibtnFinalizar.ToolTip = BUTTON_TOOLTIP_DESHABILITADO;
                        }
                        else
                        {
                            this.txtEstado.Text = enmEstadoSondaje.Iniciado.ToString();
                        }

                        //Finalizado
                        if (sondaje.Estado.CompareTo((short)enmEstadoSondaje.Finalizado.GetHashCode()) == 0)
                            this.txtEstado.Text = enmEstadoSondaje.Finalizado.ToString();
                        else
                            this.txtEstado.Text = enmEstadoSondaje.Iniciado.ToString();

                        //Cumplimiento
                        if (sondaje.CumplioLitologia.CompareTo((short)enmEstadoCumplimiento.Cumplido.GetHashCode()) == 0)
                            this.txtCumplimiento.Text = enmEstadoCumplimiento.Cumplido.ToString();
                        else
                            this.txtCumplimiento.Text = enmEstadoCumplimiento.Pendiente.ToString();
                    }
                }
                this.lblTitleModal.Text = "SONDAJE: " + this.txtNombreSondaje.Text;
            }
            catch (Exception ex)
            {

                Logger.Error("Litologia:CargarSondaje", ex);
            }
        }
        private void CargarCombos()
        {
            try
            {
                using (SEGeologoClient proxy = new SEGeologoClient("BasicHttpBinding_ISEGeologo"))
                {
                    this.Bind(this.ddlGeologo, proxy.ObtenerListItem().ToList());
                    this.ddlGeologo.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

                using (SETipoContactoClient proxy = new SETipoContactoClient("BasicHttpBinding_ISETipoContacto"))
                {
                    this.Bind(this.ddlContacto, proxy.ObtenerListItem().ToList());
                    this.ddlContacto.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

                using (SETipoRocaClient proxy = new SETipoRocaClient("BasicHttpBinding_ISETipoRoca"))
                {
                    this.Bind(this.ddlTipoRoca, proxy.ObtenerListItem().ToList());
                    this.ddlTipoRoca.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.NINGUNA, TipoDropDownList.Seleccionar.GetHashCode().ToString()));

                    //this.Bind(this.rddlTipoRoca, proxy.ObtenerListItem().ToList());
                    //this.rddlTipoRoca.Items.Insert(0, new DropDownListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

                using (SETexturaRocaClient proxy = new SETexturaRocaClient("BasicHttpBinding_ISETexturaRoca"))
                {
                    this.Bind(this.ddlTexturaRoca, proxy.ObtenerListItem().ToList());
                    this.ddlTexturaRoca.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.NOOBLIGATORIO, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

                using (SETipoRocaFracturacionClient proxy = new SETipoRocaFracturacionClient("BasicHttpBinding_ISETipoRocaFracturacion"))
                {
                    this.Bind(this.ddlFracturacionRoca, proxy.ObtenerListItem().ToList());
                    this.ddlFracturacionRoca.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.NOOBLIGATORIO, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

                using (SEColorRocaClient proxy = new SEColorRocaClient("BasicHttpBinding_ISEColorRoca"))
                {
                    this.Bind(this.ddlColorRoca, proxy.ObtenerListItem().ToList());
                    this.ddlColorRoca.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.NOOBLIGATORIO, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

                using (SETipoAlteracionLitologicaClient proxy = new SETipoAlteracionLitologicaClient("BasicHttpBinding_ISETipoAlteracionLitologica"))
                {
                    this.Bind(this.ddlTipoAlteracion, proxy.ObtenerListItem().ToList());
                    this.ddlTipoAlteracion.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

                using (SEGradoFracturacionClient proxy = new SEGradoFracturacionClient("BasicHttpBinding_ISEGradoFracturacion"))
                {
                    this.Bind(this.ddlGradoFracturacion, proxy.ObtenerListItem().ToList());
                    this.ddlGradoFracturacion.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

                using (SEMineralClient proxy = new SEMineralClient("BasicHttpBinding_ISEMineral"))
                {
                    this.Bind(this.ddlMineral, proxy.ObtenerListItem().ToList());
                    this.ddlMineral.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

                using (SEMineralCantidadClient proxy = new SEMineralCantidadClient("BasicHttpBinding_ISEMineralCantidad"))
                {
                    this.Bind(this.ddlMineralCantidad, proxy.ObtenerListItem().ToList());
                    this.ddlMineralCantidad.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

                using (SEMineralTexturaClient proxy = new SEMineralTexturaClient("BasicHttpBinding_ISEMineralTextura"))
                {
                    this.Bind(this.ddlMineralTextura, proxy.ObtenerListItem().ToList());
                    this.ddlMineralTextura.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                    //this.cboMineralTextura.Items.Insert(0, new RadComboBoxItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Litologia:CargarCombos", ex);
            }
        }

        protected override void Listar()
        {
            try
            {
                using (SELitologiaClient proxy = new SELitologiaClient("BasicHttpBinding_ISELitologia"))
                {
                    var lista = proxy.BuscarLitologiaPorSondaje1(int.Parse(this.hidCodigoSondaje.Value)).ToList();
                    this.rgLista.DataSource = lista;
                    
                    this.rgLista.DataBind();

                    #region Captura ultimo Hasta
                    //Captura ultimo Hasta y coloca como Desde para registrar nuevo
                    this.hidDesde.Value = "0";
                    if (lista != null && lista.Count > 0)
                    {
                        double hasta = (double)lista.Select(x => x.Hasta).Max();
                        this.hidDesde.Value = hasta.ToString();
                    }
                    #endregion
                }

            }
            catch (Exception ex)
            {

                Logger.Error("Litologia:Listar", ex);

            }
        }

        protected override void Limpiar()
        {
            this.hidCodigo.Value = "0";
            this.txtDesde.Text = string.Empty;
            this.txtHasta.Text = string.Empty;
            this.txtDescripcion.Text = string.Empty;
            this.txtAngulo.Text = string.Empty;

            this.ddlTipoRoca.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();
            this.ddlFracturacionRoca.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();
            this.ddlTexturaRoca.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();
            this.ddlColorRoca.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();

            this.ddlFracturacionRoca.Enabled = false;
            this.ddlTexturaRoca.Enabled = false;
            this.ddlColorRoca.Enabled = false;

            this.ddlGeologo.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();
            this.ddlContacto.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();
            this.txtFechaAnalisis.SelectedDate = null;

            //Interpretacion
            this.txtIntTipoalteracion.Text = string.Empty;
            this.txtIntCantidad.Text = string.Empty;
            this.txtIntGradoFracturacion.Text = string.Empty;
            this.txtIntMineral.Text = string.Empty;
            this.txtIntTextura.Text = string.Empty;

            //Asigna el Desde
            this.txtDesde.Text = this.hidDesde.Value;

            OcultarMensaje();
            OcultarMensajeValidacion();
        }

        private void Habilitar(bool estado = true)
        {
            this.txtDesde.Enabled = estado;
            this.txtHasta.Enabled = estado;
            this.txtDescripcion.Enabled = estado;

            //Tablas relacionadas
            this.txtAngulo.Enabled = estado;
            this.ddlTipoRoca.Enabled = estado;
            this.ddlFracturacionRoca.Enabled = estado;
            this.ddlTexturaRoca.Enabled = estado;
            this.ddlColorRoca.Enabled = estado;

            this.ddlFracturacionRoca.Enabled = estado;
            this.ddlTexturaRoca.Enabled = estado;
            this.ddlColorRoca.Enabled = estado;

            this.ddlGeologo.Enabled = estado;
            this.ddlContacto.Enabled = estado;

            //Carga las interpretaciones
            //this.txtIntTipoalteracion.Enabled = estado;
            //this.txtIntCantidad.Enabled = estado;
            //this.txtIntGradoFracturacion.Enabled = estado;
            //this.txtIntMineral.Enabled = estado;
            //this.txtIntTextura.Enabled = estado;

            this.txtFechaAnalisis.Enabled = estado;
            this.ibtnAddAlteracion.Visible = estado;
            foreach (GridDataItem item in this.rgAlteracion.Items)
            {
                ImageButton btnEliminarAlteracion = (ImageButton)item["btnEliminarAlteracion"].Controls[0];
                if (!estado)
                    btnEliminarAlteracion.ToolTip = BUTTON_TOOLTIP_DESHABILITADO;
                else
                    btnEliminarAlteracion.ToolTip = "Eliminar";
                btnEliminarAlteracion.Enabled = estado;
            }

            this.ibtnAddMineral.Visible = estado;
            foreach (GridDataItem item in this.rgMineral.Items)
            {
                ImageButton btnEliminarMineral = (ImageButton)item["btnEliminarMineral"].Controls[0];
                if (!estado)
                    btnEliminarMineral.ToolTip = BUTTON_TOOLTIP_DESHABILITADO;
                else
                    btnEliminarMineral.ToolTip = "Eliminar";
                btnEliminarMineral.Enabled = estado;
            }
            this.ibtnGuardar.Visible = estado;
        }

        protected override bool Validar(ref  StringBuilder sb)
        {
            bool retorno = true;
            try
            {


                //Valido si registro Alteraciones
                listaAlteraciones = (List<LitologiaAlteracionesResponse>)Session[SESSION_ALTERACIONES];
                if (listaAlteraciones == null || listaAlteraciones.Count == 0)
                {
                    sb.AppendLine("No ha registrado ningúna Alteración. ");
                    retorno = false;
                }
                
                if (this.ddlTipoRoca.SelectedValue.CompareTo("0") == 0)
                {
                    //Valido si registro Mineral
                    listaMinerales = (List<LitologiaMineralesResponse>)Session[SESSION_MINERALES];
                    if (listaMinerales == null || listaMinerales.Count == 0)
                    {
                        sb.AppendLine("No ha registrado ningúna Mineral. ");
                        retorno = false;
                    }

                }
                else
                {
                    this.ddlFracturacionRoca.Enabled = true;
                    this.ddlTexturaRoca.Enabled = true;
                    this.ddlColorRoca.Enabled = true;

                    if (this.ddlTexturaRoca.SelectedValue.CompareTo("0") == 0)
                    {
                        sb.AppendLine("No ha seleccionado El campo Textura. ");
                        retorno = false;
                    }
                    if (this.ddlFracturacionRoca.SelectedValue.CompareTo("0") == 0)
                    {
                        sb.AppendLine("No ha seleccionado El campo Fracturación. ");
                        retorno = false;
                    }
                    if (this.ddlColorRoca.SelectedValue.CompareTo("0") == 0)
                    {
                        sb.AppendLine("No ha seleccionado El campo Color. ");
                        retorno = false;
                    }

                }

                using (var proxy = new SELitologiaClient("BasicHttpBinding_ISELitologia"))
                {
                    int resultInterseccion = proxy.ValidarInterseccionLitologia(int.Parse(this.hidCodigoSondaje.Value), this.hidCodigo.Value, double.Parse(this.txtDesde.Text), double.Parse(this.txtHasta.Text));
                    if (resultInterseccion == 1)
                    {
                        sb.AppendLine("Existe intersección o espacios con rangos ingresados.");
                        retorno = false;
                    }
                }

            }
            catch (Exception ex)
            {
                retorno = false;
                Logger.Error("Litologia:Validar", ex);
            }
            return retorno;
        }

        #region Mensajes
        protected override void MostrarMensajeValidacion(string mensaje)
        {
            this.pnlMensajeValidacion.Visible = true;
            this.lblMensajeValidacion.Text = mensaje;
        }

        protected override void OcultarMensajeValidacion()
        {
            this.pnlMensajeValidacion.Visible = false;
            this.lblMensajeValidacion.Text = string.Empty;
        }

        protected override void MostrarMensaje(string mensaje, enmTipoMensajeMostrar tipoMensaje = enmTipoMensajeMostrar.Informativa)
        {
            this.pnlMensaje.Visible = true;
            this.lblMensaje.Text = mensaje;
            this.pnlMensaje.CssClass = this.ObtenerEstiloMensaje(tipoMensaje);
        }

        protected override void OcultarMensaje()
        {
            this.pnlMensaje.Visible = false;
            this.lblMensaje.Text = string.Empty;
        }

        #endregion

        private void CargarDatos(string codigoLitologia)
        {
            try
            {
                Litologia litologia;
                using (SELitologiaClient proxy = new SELitologiaClient("BasicHttpBinding_ISELitologia"))
                {
                    litologia = proxy.ObtenerLitologia(int.Parse(this.hidCodigoSondaje.Value), codigoLitologia);
                    if (litologia != null)
                    {
                        this.hidCodigo.Value = litologia.CodigoLitologia;
                        this.txtDesde.Text = litologia.Desde.ToString();
                        this.txtHasta.Text = litologia.Hasta.ToString();
                        this.txtDescripcion.Text = litologia.Descripcion;

                        //Tablas relacionadas
                        this.txtAngulo.Text = litologia.Angulo.ToString();

                        if (litologia.CodigoTipoRoca != null)
                        {
                            this.ddlTipoRoca.SelectedValue = litologia.CodigoTipoRoca.ToString();
                            this.ddlFracturacionRoca.Enabled = true;
                            this.ddlTexturaRoca.Enabled = true;
                            this.ddlColorRoca.Enabled = true;
                        }
                        else
                        {
                            this.ddlTipoRoca.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();
                            this.ddlFracturacionRoca.Enabled = false;
                            this.ddlTexturaRoca.Enabled = false;
                            this.ddlColorRoca.Enabled = false;
                        }

                        this.ddlFracturacionRoca.SelectedValue = (litologia.CodigoTipoRocaFracturacion != null) ? litologia.CodigoTipoRocaFracturacion.ToString() : "0";
                        this.ddlTexturaRoca.SelectedValue = (litologia.CodigoTexturaRoca != null) ? litologia.CodigoTexturaRoca.ToString() : "0";
                        this.ddlColorRoca.SelectedValue = (litologia.CodigoColorRoca != null) ? litologia.CodigoColorRoca.ToString() : "0";

                        this.ddlGeologo.SelectedValue = litologia.CodigoGeologo.ToString();
                        this.ddlContacto.SelectedValue = litologia.CodigoTipoContacto.ToString();

                        //Carga las interpretaciones
                        this.txtIntTipoalteracion.Text = litologia.InterpretaTipoAlteracion;
                        this.txtIntCantidad.Text = litologia.InterpretaCantidadMineral;
                        this.txtIntGradoFracturacion.Text = litologia.InterpretaGradoAlteracion;
                        this.txtIntMineral.Text = litologia.InterpretaMinerales;
                        this.txtIntTextura.Text = litologia.InterpretaTexturaMineral;

                        if (litologia.FechaAnalisis != null)
                        {
                            this.txtFechaAnalisis.SelectedDate = litologia.FechaAnalisis;
                        }
                        else
                        {
                            this.txtFechaAnalisis.SelectedDate = null;
                        }
                    }
                }

                //Obtengo los detalles
                using (SELitologiaAlteracionesClient proxy = new SELitologiaAlteracionesClient("BasicHttpBinding_ISELitologiaAlteraciones"))
                {
                    listaAlteraciones = proxy.BuscarLitologiaAlteraciones(int.Parse(this.hidCodigoSondaje.Value), codigoLitologia).ToList();
                    this.rgAlteracion.DataSource = listaAlteraciones;
                    this.rgAlteracion.DataBind();
                    Session[SESSION_ALTERACIONES] = listaAlteraciones;
                }

                using (SELitologiaMineralesClient proxy = new SELitologiaMineralesClient("BasicHttpBinding_ISELitologiaMinerales"))
                {
                    listaMinerales = proxy.BuscarLitologiaMinerales(int.Parse(this.hidCodigoSondaje.Value), codigoLitologia).ToList();
                    this.rgMineral.DataSource = listaMinerales;
                    this.rgMineral.DataBind();
                    Session[SESSION_MINERALES] = listaMinerales;
                }
            }
            catch (Exception)
            {

                throw;
            }
        }

        private void GenerarInterpretacion(int opcion)
        {
            try
            {
                #region Combox seleccionables Items

                string interpretacionTipoAlteracion = string.Empty;
                string interpretacionGradoFracturacion = string.Empty;
                string interpretacionMinerales = string.Empty;
                string interpretacionCantidadMineral = string.Empty;
                string interpretacionTexturaMineral = string.Empty;

                if (opcion == 0)
                {
                    //Alteraciones
                    if (Session[SESSION_ALTERACIONES] != null)
                    {
                        listaAlteraciones = (List<LitologiaAlteracionesResponse>)Session[SESSION_ALTERACIONES];
                        List<int> alteraciones = listaAlteraciones.Select(x => x.CodigoTipoAlteracionLitologica).ToList();
                        foreach (var item in alteraciones)
                        {
                            using (SETipoAlteracionLitologicaClient proxy = new SETipoAlteracionLitologicaClient("BasicHttpBinding_ISETipoAlteracionLitologica"))
                            {
                                var entidad = proxy.ObtenerTipoAlteracionLitologica(item);
                                if (entidad != null)
                                    interpretacionTipoAlteracion = interpretacionTipoAlteracion + entidad.Abreviatura + ",";
                            }
                        }
                        List<int> gradoFracturaciones = listaAlteraciones.Select(x => x.CodigoGradoFracturacion).ToList();
                        foreach (var item in gradoFracturaciones)
                        {
                            using (SEGradoFracturacionClient proxy = new SEGradoFracturacionClient("BasicHttpBinding_ISEGradoFracturacion"))
                            {
                                var entidad = proxy.ObtenerGradoFracturacion(item);
                                if (entidad != null)
                                    interpretacionGradoFracturacion = interpretacionGradoFracturacion + entidad.Abreviatura + ",";
                            }
                        }
                    }

                    this.txtIntTipoalteracion.Text = interpretacionTipoAlteracion;
                    this.txtIntGradoFracturacion.Text = interpretacionGradoFracturacion;
                }
                else
                {
                    //Minerales
                    if (Session[SESSION_MINERALES] != null)
                    {
                        listaMinerales = (List<LitologiaMineralesResponse>)Session[SESSION_MINERALES];
                        List<int> minerales = listaMinerales.Select(x => x.CodigoMineral).ToList();
                        foreach (var item in minerales)
                        {
                            using (SEMineralClient proxy = new SEMineralClient("BasicHttpBinding_ISEMineral"))
                            {
                                var entidad = proxy.ObtenerMineral(item);
                                if (entidad != null)
                                    interpretacionMinerales = interpretacionMinerales + entidad.Abreviatura + ",";
                            }
                        }

                        List<int> cantidadMinerales = listaMinerales.Select(x => x.CodigoMineralCantidad).ToList();
                        foreach (var item in cantidadMinerales)
                        {
                            using (SEMineralCantidadClient proxy = new SEMineralCantidadClient("BasicHttpBinding_ISEMineralCantidad"))
                            {
                                var entidad = proxy.ObtenerMineralCantidad(item);
                                if (entidad != null)
                                    interpretacionCantidadMineral = interpretacionCantidadMineral + entidad.Abreviatura + ",";
                            }
                        }

                        List<int> texturaMinerales = listaMinerales.Select(x => x.CodigoMineralTextura).ToList();
                        foreach (var item in texturaMinerales)
                        {
                            using (SEMineralTexturaClient proxy = new SEMineralTexturaClient("BasicHttpBinding_ISEMineralTextura"))
                            {
                                var entidad = proxy.ObtenerMineralTextura(item);
                                if (entidad != null)
                                    interpretacionTexturaMineral = interpretacionTexturaMineral + entidad.Abreviatura + ",";
                            }
                        }
                    }

                    this.txtIntMineral.Text = interpretacionMinerales;
                    this.txtIntTextura.Text = interpretacionTexturaMineral;
                    this.txtIntCantidad.Text = interpretacionCantidadMineral;
                }

                #endregion
            }
            catch (Exception ex)
            {

                Logger.Error("Litologia:GenerarInterpretacion", ex);
            }
        }

        protected override void Guardar()
        {
            try
            {
                StringBuilder sb = new StringBuilder();
                if (!this.Validar(ref sb))
                {
                    this.MostrarMensajeValidacion(sb.ToString());
                    return;
                }

                Litologia litologia = new Litologia();
                litologia.CodigoSondaje = int.Parse(this.hidCodigoSondaje.Value);
                litologia.CodigoLitologia = this.hidCodigo.Value;
                litologia.Desde = double.Parse(this.txtDesde.Text.Trim());
                litologia.Hasta = double.Parse(this.txtHasta.Text.Trim());
                litologia.Descripcion = this.txtDescripcion.Text.Trim();

                litologia.Angulo = double.Parse(this.txtAngulo.Text.Trim());
                litologia.InterpretaTipoAlteracion = this.txtIntTipoalteracion.Text;
                litologia.InterpretaCantidadMineral = this.txtIntCantidad.Text;
                litologia.InterpretaGradoAlteracion = this.txtIntGradoFracturacion.Text;
                litologia.InterpretaMinerales = this.txtIntMineral.Text;
                litologia.InterpretaTexturaMineral = this.txtIntTextura.Text;

                if (this.ddlTipoRoca.SelectedValue.CompareTo("0") != 0)
                {
                    litologia.CodigoTipoRoca = int.Parse(this.ddlTipoRoca.SelectedValue);
                }
                else
                {
                    litologia.CodigoTipoRoca = null;
                }

                if ((this.ddlFracturacionRoca.SelectedValue.CompareTo("0") != 0))
                    litologia.CodigoTipoRocaFracturacion = int.Parse(this.ddlFracturacionRoca.SelectedValue);
                else
                    litologia.CodigoTipoRocaFracturacion = null;

                if (this.ddlTexturaRoca.SelectedValue.CompareTo("0") != 0)
                    litologia.CodigoTexturaRoca = int.Parse(this.ddlTexturaRoca.SelectedValue);
                else
                    litologia.CodigoTexturaRoca = null;

                if (this.ddlColorRoca.SelectedValue.CompareTo("0") != 0)
                    litologia.CodigoColorRoca = int.Parse(this.ddlColorRoca.SelectedValue);
                else
                    litologia.CodigoColorRoca = null;

                litologia.CodigoGeologo = int.Parse(this.ddlGeologo.SelectedValue);
                litologia.CodigoTipoContacto = int.Parse(this.ddlContacto.SelectedValue.ToString());

                litologia.FechaAnalisis = (DateTime)this.txtFechaAnalisis.SelectedDate;

                #region Detalles
                //Agrega detalles Alteraciones de Litologia
                listaAlteraciones = (List<LitologiaAlteracionesResponse>)Session[SESSION_ALTERACIONES];
                if (listaAlteraciones != null)
                {
                    List<LitologiaAlteraciones> litologiasAlteraciones = new List<LitologiaAlteraciones>();
                    foreach (var item in listaAlteraciones)
                    {
                        LitologiaAlteraciones detalle = new LitologiaAlteraciones();
                        detalle.CodigoGradoFracturacion = item.CodigoGradoFracturacion;
                        detalle.CodigoSondaje = int.Parse(this.hidCodigoSondaje.Value);
                        detalle.CodigoLitologia = this.hidCodigo.Value;
                        detalle.CodigoTipoAlteracionLitologica = item.CodigoTipoAlteracionLitologica;
                        litologiasAlteraciones.Add(detalle);
                    }
                    litologia.LitologiaAlteraciones = litologiasAlteraciones.ToArray();
                }

                listaMinerales = (List<LitologiaMineralesResponse>)Session[SESSION_MINERALES];
                if (listaMinerales != null)
                {
                    List<LitologiaMinerales> litologiaMinerales = new List<LitologiaMinerales>();
                    foreach (var item in listaMinerales)
                    {
                        LitologiaMinerales detalle = new LitologiaMinerales();
                        detalle.CodigoMineral = item.CodigoMineral;
                        detalle.CodigoSondaje = int.Parse(this.hidCodigoSondaje.Value);
                        detalle.CodigoLitologia = this.hidCodigo.Value;
                        detalle.CodigoMineralCantidad = item.CodigoMineralCantidad;
                        detalle.CodigoMineralTextura = item.CodigoMineralTextura;
                        litologiaMinerales.Add(detalle);
                    }
                    litologia.LitologiaMinerales = litologiaMinerales.ToArray();
                }
                #endregion

                string result = string.Empty;
                using (SELitologiaClient proxy = new SELitologiaClient("BasicHttpBinding_ISELitologia"))
                {
                    if (this.hidCodigo.Value.CompareTo("0") == 0)
                    {
                        result = proxy.InsertarLitologia(litologia);
                    }
                    else
                    {
                        result = proxy.ModificarLitologia(litologia);
                    }
                }

                if (result.CompareTo("Registrado") != 0)
                {
                    MostrarMensajeValidacion(result);
                    return;
                }

                Session[SESSION_ALTERACIONES] = null;
                Session[SESSION_MINERALES] = null;
                this.mpRegistro.Hide();
                this.MostrarMensaje(MSG_OK_GRABAR);
                this.Listar();
            }
            catch (Exception ex)
            {
                MostrarMensajeValidacion(MSG_ERROR_GRABAR);
                Logger.Error("Litologia:Guardar", ex);
            }
        }

        protected void rgLista_ItemCommand(object sender, GridCommandEventArgs e)
        {
            if (e.CommandName.CompareTo("Editar") == 0)
            {
                var item = (GridEditableItem)e.Item;
                string codigoLitologia = item.GetDataKeyValue("CodigoLitologia").ToString();
                //Carga detalle de sondaje
                Habilitar(true);
                this.CargarDatos(codigoLitologia);
                OcultarMensaje();
                OcultarMensajeValidacion();
                this.mpRegistro.Show();
            }

            if (e.CommandName.CompareTo("Ver") == 0)
            {
                var item = (GridEditableItem)e.Item;
                string codigoLitologia = item.GetDataKeyValue("CodigoLitologia").ToString();
                //Carga detalle de sondaje
                this.CargarDatos(codigoLitologia);
                Habilitar(false);
                OcultarMensaje();
                OcultarMensajeValidacion();
                this.mpRegistro.Show();
            }

            if (e.CommandName == RadGrid.FilterCommandName)
            {
                Listar();
            }
        }

        protected void rgLista_DeleteCommand(object sender, GridCommandEventArgs e)
        {
            try
            {
                string codigoLitologia = ((GridDataItem)e.Item).GetDataKeyValue("CodigoLitologia").ToString();

                using (var proxy = new SELitologiaClient("BasicHttpBinding_ISELitologia"))
                {
                    proxy.EliminarLitologia(int.Parse(this.hidCodigoSondaje.Value), codigoLitologia);
                }
                this.Listar();
                this.MostrarMensaje(MSG_OK_ELIMINAR);
            }
            catch (Exception ex)
            {
                this.MostrarMensaje(MSG_ERROR_ELIMINAR, enmTipoMensajeMostrar.Error);
                Logger.Error("Litologia:Eliminar", ex);
            }
        }

        protected void imgClose_Click(object sender, ImageClickEventArgs e)
        {
            Session[SESSION_ALTERACIONES] = null;
            Session[SESSION_MINERALES] = null;
            this.mpRegistro.Hide();
        }

        private void LimpiarDetalles()
        {
            listaAlteraciones.Clear();
            listaMinerales.Clear();
            Session[SESSION_ALTERACIONES] = listaAlteraciones;
            Session[SESSION_MINERALES] = listaMinerales;

            this.rgAlteracion.DataSource = listaAlteraciones;
            this.rgAlteracion.DataBind();
            this.rgMineral.DataSource = listaMinerales;
            this.rgMineral.DataBind();
        }

        protected void ibtnRegistrar_Click(object sender, ImageClickEventArgs e)
        {
            try
            {

                Habilitar(true);
                this.Limpiar();
                //Limpia detalle
                LimpiarDetalles();
                this.mpRegistro.Show();

            }
            catch (Exception ex)
            {

                Logger.Error("Litologia:ibtnRegistrar_Click", ex);
            }
        }

        protected void ibtnGuardar_Click(object sender, ImageClickEventArgs e)
        {
            this.Guardar();
        }

        protected void ibtnCancelar_Click(object sender, ImageClickEventArgs e)
        {
            Session[SESSION_ALTERACIONES] = null;
            Session[SESSION_MINERALES] = null;
            this.mpRegistro.Hide();
        }

        protected void ibtnFinalizar_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                string result = string.Empty;
                using (var proxy = new SESondajeClient("BasicHttpBinding_ISESondaje"))
                {
                    result = proxy.FinalizarCumplimiento(int.Parse(this.hidCodigoSondaje.Value), enmTipoAnalisis.Litologia.GetHashCode());
                }
                if (result.CompareTo("Cumplido") != 0)
                    MostrarMensaje(result, enmTipoMensajeMostrar.Error);
                else
                    MostrarMensaje(result);
                CargarSondaje();
                Listar();
            }
            catch (Exception ex)
            {
                MostrarMensaje(MSG_ERROR_GENERICO, enmTipoMensajeMostrar.Error);
                Logger.Error("Litologia:ibtnFinalizar_Click", ex);
            }
        }

        protected void ibtnAddAlteracion_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                bool agregado = false;
                this.OcultarMensajeValidacion();
                listaAlteraciones = (List<LitologiaAlteracionesResponse>)Session[SESSION_ALTERACIONES];
                if (listaAlteraciones == null) listaAlteraciones = new List<LitologiaAlteracionesResponse>();
                foreach (var detalle in listaAlteraciones)
                {
                    if (detalle.CodigoTipoAlteracionLitologica == int.Parse(this.ddlTipoAlteracion.SelectedValue)) //&& detalle.CodigoGradoFracturacion == int.Parse(this.ddlGradoFracturacion.SelectedValue))
                    {
                        //Si encuentra en detalle ya no se agrega
                        this.rgAlteracion.DataSource = listaAlteraciones;
                        this.rgAlteracion.DataBind();
                        Session[SESSION_ALTERACIONES] = listaAlteraciones;
                        this.MostrarMensajeValidacion("Ya se registró la Alteración");
                        agregado = true;
                        break;
                    }
                }

                //Si no existe regitrado agrega Items
                if (!agregado)
                {
                    LitologiaAlteracionesResponse item = new LitologiaAlteracionesResponse();
                    item.Orden = listaAlteraciones.Count + 1;
                    item.CodigoGradoFracturacion = int.Parse(this.ddlGradoFracturacion.SelectedValue);
                    item.DescripcionGradoFracturacion = this.ddlGradoFracturacion.SelectedItem.Text;
                    item.CodigoSondaje = int.Parse(this.hidCodigoSondaje.Value);
                    item.CodigoLitologia = this.hidCodigo.Value;
                    item.CodigoTipoAlteracionLitologica = int.Parse(this.ddlTipoAlteracion.SelectedValue);
                    item.DescripcionTipoAlteracion = this.ddlTipoAlteracion.SelectedItem.Text;
                    listaAlteraciones.Add(item);

                    this.rgAlteracion.DataSource = listaAlteraciones;
                    this.rgAlteracion.DataBind();
                    Session[SESSION_ALTERACIONES] = listaAlteraciones;
                }

                GenerarInterpretacion(0);
            }
            catch (Exception ex)
            {

                Logger.Error("Litologia:ibtnAddAlteracion_Click", ex);
            }
        }

        protected void ibtnAddMineral_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                bool agregado = false;
                this.OcultarMensajeValidacion();
                listaMinerales = (List<LitologiaMineralesResponse>)Session[SESSION_MINERALES];
                if (listaMinerales == null) listaMinerales = new List<LitologiaMineralesResponse>();
                foreach (var detalle in listaMinerales)
                {
                    if (detalle.CodigoMineral == int.Parse(this.ddlMineral.SelectedValue) && detalle.CodigoMineralCantidad == int.Parse(this.ddlMineralCantidad.SelectedValue) &&
                    detalle.CodigoMineralTextura == int.Parse(this.ddlMineralTextura.SelectedValue))
                    {
                        //No se agrega item duplicado
                        this.rgMineral.DataSource = listaMinerales;
                        this.rgMineral.DataBind();
                        Session[SESSION_MINERALES] = listaMinerales;
                        this.MostrarMensajeValidacion("Ya se registró la Mineral");
                        agregado = true;
                        break;
                    }
                }

                if (!agregado)
                {
                    //Si no existe agrega nuevos Items
                    LitologiaMineralesResponse item = new LitologiaMineralesResponse();
                    item.Orden = (short)(listaMinerales.Count + 1);
                    item.CodigoMineralCantidad = int.Parse(this.ddlMineralCantidad.SelectedValue);
                    item.CodigoMineralTextura = int.Parse(this.ddlMineralTextura.SelectedValue);
                    item.CodigoSondaje = int.Parse(this.hidCodigoSondaje.Value);
                    item.CodigoLitologia = this.hidCodigo.Value;
                    item.CodigoMineral = int.Parse(this.ddlMineral.SelectedValue);
                    item.DescripcionMineralCantidad = this.ddlMineralCantidad.SelectedItem.Text;
                    item.DescripcionMineralTextura = this.ddlMineralTextura.SelectedItem.Text;
                    item.DescripcionMineral = this.ddlMineral.SelectedItem.Text;
                    listaMinerales.Add(item);

                    this.rgMineral.DataSource = listaMinerales;
                    this.rgMineral.DataBind();
                    Session[SESSION_MINERALES] = listaMinerales;
                }

                GenerarInterpretacion(1);
            }
            catch (Exception ex)
            {

                Logger.Error("Litologia:ibtnAddMineral_Click", ex);
            }
        }

        protected void rgAlteracion_ItemCommand(object sender, GridCommandEventArgs e)
        {
            try
            {
                if (e.CommandName.CompareTo("Eliminar") == 0)
                {
                    listaAlteraciones = (List<LitologiaAlteracionesResponse>)Session[SESSION_ALTERACIONES];
                    int orden = int.Parse(((GridDataItem)e.Item).GetDataKeyValue("Orden").ToString());
                    if (listaAlteraciones != null)
                    {
                        foreach (LitologiaAlteracionesResponse item in listaAlteraciones)
                        {
                            if (item.Orden == orden)
                            {
                                listaAlteraciones.Remove(item);
                                break;
                            }
                        }
                        this.rgAlteracion.DataSource = listaAlteraciones;
                        this.rgAlteracion.DataBind();
                        Session[SESSION_ALTERACIONES] = listaAlteraciones;
                        this.GenerarInterpretacion(0);
                    }
                }
            }
            catch (Exception ex)
            {

                Logger.Error("Litologia:ibtnAddMineral_Click", ex);
            }
        }

        protected void rgMineral_ItemCommand(object sender, GridCommandEventArgs e)
        {
            try
            {
                if (e.CommandName.CompareTo("Eliminar") == 0)
                {
                    listaMinerales = (List<LitologiaMineralesResponse>)Session[SESSION_MINERALES];
                    int orden = int.Parse(((GridDataItem)e.Item).GetDataKeyValue("Orden").ToString());
                    if (listaAlteraciones != null)
                    {
                        foreach (LitologiaMineralesResponse item in listaMinerales)
                        {
                            if (item.Orden == orden)
                            {
                                listaMinerales.Remove(item);
                                break;
                            }
                        }

                        this.rgMineral.DataSource = listaMinerales;
                        this.rgMineral.DataBind();
                        Session[SESSION_MINERALES] = listaMinerales;
                        this.GenerarInterpretacion(1);
                    }
                }
            }
            catch (Exception ex)
            {

                Logger.Error("Litologia:rgMineral_ItemCommand", ex);
            }
        }

        protected void rgLista_PageIndexChanged(object sender, GridPageChangedEventArgs e)
        {
            this.Listar();
        }

        protected void rgLista_SortCommand(object sender, GridSortCommandEventArgs e)
        {
            this.Listar();
        }

        protected void ibtnExportar_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                Listar();
                string alternateText = "ExcelML";
                this.rgLista.ExportSettings.Excel.Format = (GridExcelExportFormat)Enum.Parse(typeof(GridExcelExportFormat), alternateText);
                this.rgLista.ExportSettings.IgnorePaging = true;
                this.rgLista.ExportSettings.ExportOnlyData = true;
                this.rgLista.ExportSettings.OpenInNewWindow = true;
                this.rgLista.MasterTableView.ExportToExcel();
            }
            catch (Exception ex)
            {

                this.MostrarMensaje(MSG_ERROR_GENERICO, enmTipoMensajeMostrar.Error);
                Logger.Error("Litologia:ibtnExportar_Click", ex);
            }

        }

        protected void rgLista_ItemDataBound(object sender, GridItemEventArgs e)
        {
            try
            {
                if (e.Item.ItemType == GridItemType.Item || e.Item.ItemType == GridItemType.AlternatingItem)
                {
                    GridDataItem item = (GridDataItem)e.Item;
                    if (this.hidEstadoSondaje.Value.CompareTo(enmEstadoSondaje.Finalizado.GetHashCode().ToString()) == 0 ||
                        this.hidCumplimiento.Value.CompareTo(enmEstadoCumplimiento.Cumplido.GetHashCode().ToString()) == 0)
                    {
                        ImageButton btnEliminar = (ImageButton)item["btnEliminar"].Controls[0];
                        btnEliminar.ToolTip = BUTTON_TOOLTIP_DESHABILITADO;
                        btnEliminar.Enabled = false;

                        ImageButton btnEditar = (ImageButton)item["btnEditar"].Controls[0];
                        btnEditar.ToolTip = BUTTON_TOOLTIP_DESHABILITADO;
                        btnEditar.Enabled = false;
                    }
                    HiddenField hidError = (HiddenField)item.FindControl("hidError");
                    if (int.Parse(hidError.Value) == 1)
                    {
                        Label lblDesde = (Label)item.FindControl("lblDesde");
                        lblDesde.ForeColor = System.Drawing.Color.Red;
                    }
                }
            }
            catch (Exception ex)
            {

                Logger.Error("Litologia:rgLista_ItemDataBound", ex);
            }
        }

        protected void rgLista_PageSizeChanged(object sender, GridPageSizeChangedEventArgs e)
        {
            this.Listar();
        }


    }
}